package com.cencat.driver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.driver.entity.Driver;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 司机服务接口
 * 
 * @author cencat
 * @version 1.0
 * @since 2024-12-19
 */
public interface DriverService extends IService<Driver> {

    /**
     * 分页查询司机列表
     * 
     * @param page 分页参数
     * @param driverStatus 司机状态
     * @param workStatus 工作状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 司机分页数据
     */
    IPage<Driver> getDriverPage(Page<Driver> page, Integer driverStatus, Integer workStatus, 
                               LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据手机号查询司机
     * 
     * @param phone 手机号
     * @return 司机信息
     */
    Driver getDriverByPhone(String phone);

    /**
     * 根据身份证号查询司机
     * 
     * @param idCard 身份证号
     * @return 司机信息
     */
    Driver getDriverByIdCard(String idCard);

    /**
     * 根据驾驶证号查询司机
     * 
     * @param licenseNo 驾驶证号
     * @return 司机信息
     */
    Driver getDriverByLicenseNo(String licenseNo);

    /**
     * 查询在线司机列表
     * 
     * @param latitude 纬度
     * @param longitude 经度
     * @param radius 半径（公里）
     * @param limit 限制数量
     * @return 在线司机列表
     */
    List<Driver> getOnlineDrivers(java.math.BigDecimal latitude, java.math.BigDecimal longitude, 
                                 java.math.BigDecimal radius, Integer limit);

    /**
     * 查询空闲司机列表
     * 
     * @param latitude 纬度
     * @param longitude 经度
     * @param radius 半径（公里）
     * @param limit 限制数量
     * @return 空闲司机列表
     */
    List<Driver> getAvailableDrivers(java.math.BigDecimal latitude, java.math.BigDecimal longitude, 
                                    java.math.BigDecimal radius, Integer limit);

    /**
     * 创建司机
     * 
     * @param driver 司机信息
     * @return 创建结果
     */
    boolean createDriver(Driver driver);

    /**
     * 更新司机状态
     * 
     * @param driverId 司机ID
     * @param driverStatus 司机状态
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverStatus(Long driverId, Integer driverStatus, LocalDateTime updateTime);

    /**
     * 更新司机工作状态
     * 
     * @param driverId 司机ID
     * @param workStatus 工作状态
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateWorkStatus(Long driverId, Integer workStatus, LocalDateTime updateTime);

    /**
     * 更新司机位置
     * 
     * @param driverId 司机ID
     * @param latitude 纬度
     * @param longitude 经度
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverLocation(Long driverId, java.math.BigDecimal latitude, 
                                java.math.BigDecimal longitude, LocalDateTime updateTime);

    /**
     * 批量更新司机状态
     * 
     * @param driverIds 司机ID列表
     * @param driverStatus 司机状态
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean batchUpdateDriverStatus(List<Long> driverIds, Integer driverStatus, LocalDateTime updateTime);

    /**
     * 统计司机数量
     * 
     * @param driverStatus 司机状态
     * @param workStatus 工作状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 司机数量
     */
    Long countDrivers(Integer driverStatus, Integer workStatus, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询司机统计数据
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计数据
     */
    List<Map<String, Object>> getDriverStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询司机评分统计
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 评分统计
     */
    Map<String, Object> getDriverRatingStats(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询司机收入统计
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 收入统计
     */
    Map<String, Object> getDriverIncomeStats(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询司机订单统计
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单统计
     */
    Map<String, Object> getDriverOrderStats(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询司机工作时长统计
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 工作时长统计
     */
    Map<String, Object> getDriverWorkTimeStats(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询最近活跃司机
     * 
     * @param hours 小时数
     * @param limit 限制数量
     * @return 活跃司机列表
     */
    List<Driver> getRecentActiveDrivers(Integer hours, Integer limit);

    /**
     * 查询司机排行榜
     * 
     * @param rankType 排行类型（1-订单数量，2-收入，3-评分，4-工作时长）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 排行榜数据
     */
    List<Map<String, Object>> getDriverRanking(Integer rankType, LocalDateTime startTime, 
                                              LocalDateTime endTime, Integer limit);

    /**
     * 智能司机推荐
     * 
     * @param orderId 订单ID
     * @param pickupLatitude 接单纬度
     * @param pickupLongitude 接单经度
     * @param limit 推荐数量
     * @return 推荐司机列表
     */
    List<Map<String, Object>> getSmartDriverRecommendation(Long orderId, java.math.BigDecimal pickupLatitude, 
                                                           java.math.BigDecimal pickupLongitude, Integer limit);

    /**
     * 查询司机轨迹
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 司机轨迹数据
     */
    List<Map<String, Object>> getDriverTrajectory(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 更新司机评分
     * 
     * @param driverId 司机ID
     * @param rating 评分
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverRating(Long driverId, java.math.BigDecimal rating, LocalDateTime updateTime);

    /**
     * 更新司机收入
     * 
     * @param driverId 司机ID
     * @param income 收入金额
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverIncome(Long driverId, java.math.BigDecimal income, LocalDateTime updateTime);

    /**
     * 更新司机订单数
     * 
     * @param driverId 司机ID
     * @param orderCount 订单数量
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverOrderCount(Long driverId, Integer orderCount, LocalDateTime updateTime);

    /**
     * 更新司机工作时长
     * 
     * @param driverId 司机ID
     * @param workHours 工作时长（小时）
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverWorkHours(Long driverId, java.math.BigDecimal workHours, LocalDateTime updateTime);

    /**
     * 司机认证
     * 
     * @param driverId 司机ID
     * @param certType 认证类型
     * @param certStatus 认证状态
     * @param updateTime 更新时间
     * @return 认证结果
     */
    boolean certifyDriver(Long driverId, Integer certType, Integer certStatus, LocalDateTime updateTime);

    /**
     * 查询待认证司机
     * 
     * @param certType 认证类型
     * @param limit 限制数量
     * @return 待认证司机列表
     */
    List<Driver> getPendingCertificationDrivers(Integer certType, Integer limit);

    /**
     * 查询司机车辆信息
     * 
     * @param driverId 司机ID
     * @return 车辆信息
     */
    Map<String, Object> getDriverVehicleInfo(Long driverId);

    /**
     * 更新司机车辆信息
     * 
     * @param driverId 司机ID
     * @param vehicleInfo 车辆信息
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateDriverVehicleInfo(Long driverId, Map<String, Object> vehicleInfo, LocalDateTime updateTime);

    /**
     * 查询司机违规记录
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 违规记录
     */
    List<Map<String, Object>> getDriverViolationRecords(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 添加司机违规记录
     * 
     * @param driverId 司机ID
     * @param violationType 违规类型
     * @param violationDesc 违规描述
     * @param createTime 创建时间
     * @return 添加结果
     */
    boolean addDriverViolationRecord(Long driverId, Integer violationType, String violationDesc, LocalDateTime createTime);

}